package com.jt.service;

import com.jt.vo.ImageVO;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

@Service
public class FileServiceImpl implements FileService {

    private String localDir = "E:/JT_SOFT/images";

    /**
     * 业务说明:
     *  1.校验图片的类型,是否为jpg/png/gif
     *  2.校验文件是否为恶意程序,防止木马病毒
     *  3.分目录存储
     *  4.
     * @param file
     * @return
     */
    @Override
    public ImageVO upload(MultipartFile file) {
        //1. 校验图片的类型
        //1.1 获取图片的名称,如果a.jpg,那么如何判断文件是否为图片
        String fileName = file.getOriginalFilename();
        //1.2 abc.jpg  ABC.jpg  需要全部转小写,这样大小写就都可以匹配了
        fileName = fileName.toLowerCase();


        //1.3 正则表达式写法
        String regex = "^.+\\.(jpg|png|gif)$"; //图片校验的正则表达式
        if(!fileName.matches(regex)){
            return null;
        }

        //2.防止木马病毒,图片的高度和宽度
        try {
            BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
            int width = bufferedImage.getWidth();
            int height = bufferedImage.getHeight();

            if(width == 0 || height == 0){
                //没有像素,说明不是图片
                return null;
            }

            //3.分目录存储,提交时间
            String datePath = new SimpleDateFormat("/yyyy/MM/dd").format(new Date());

            //3.1 创建图片目录
            String dirPath = localDir + datePath;
            //3.2创建目录
            File dirFile = new File(dirPath);
            if(!dirFile.exists()){
                dirFile.mkdirs();
            }

            //4.要求文件名称不重名
            String uuid = UUID.randomUUID().toString();
            int index = fileName.lastIndexOf(".");
            String type = fileName.substring(index);
            fileName = uuid + type;


            //5.实现文件上传
            String realFilePath = dirPath + fileName;
            file.transferTo(new File(realFilePath));

        } catch (IOException e) {
            e.printStackTrace();
            //如果出现了异常信息,则返回null即可
            return null;
        }
        return null;
    }

    /**
     * 实现文件上传的具体操作:
     *      1.获取文件上传的名称
     *      2.准备文件上传的目录
     *      3.实现文件上传的操作
     *
     * 注意事项:
     *      1.图片选择京东的图片
     *      2.图片大小不要超过1M
     * @param file
     * @return
     */

//    @Override
//    public ImageVO upload(MultipartFile file) {
//
//        //1.获取文件名称
//        String filename = file.getOriginalFilename();
//
//        //2.指定磁盘路径信息
//        String filePath = "E:/JT_SOFT/images";
//
//        //3.校验目录是否存在
//        File dirFile = new File(filePath);
//        if(!dirFile.exists()){
//            dirFile.mkdirs();  //创建多级目录
//        }
//
//
//        //4.准备文件的全路径  "E:/JT_SOFT/images/abc.jpg"
//        String path = filePath + "/" + filename;
//
//        //5.将路径包装为File对象
//        File imageFile = new File(path);
//
//        //6.实现上传
//        try {
//            file.transferTo(imageFile);
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//
//        return null;
//    }
}
